Objetivo

Executar algumas análises nas linguegens R e python,para essas análises foi utilizado o banco de dados steam.csv que contem uma base de dados referente a alguns games da Steam,para realização da análise foi utilizado o software Rstudio

Carregando o banco de dados

import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns
import pandas as pd

import plotly
import plotly.graph_objects as go
import plotly.express as px

from plotly.offline import plot, iplot, init_notebook_mode


df = pd.read_csv('steam.csv')

Observando algumas linhas dos nossos dados

df.head()
##    appid                       name  ...             owners  price
## 0     10             Counter-Strike  ...  10000000-20000000   7.19
## 1     20      Team Fortress Classic  ...   5000000-10000000   3.99
## 2     30              Day of Defeat  ...   5000000-10000000   3.99
## 3     40         Deathmatch Classic  ...   5000000-10000000   3.99
## 4     50  Half-Life: Opposing Force  ...   5000000-10000000   3.99
## 
## [5 rows x 18 columns]
df['appid'].sample()
## 26720    1034160
## Name: appid, dtype: int64

Verificando dados nulos e contando a quantidade de NAS presente em cada coluna

df.isnull().sum()
## appid               0
## name                0
## release_date        0
## english             0
## developer           0
## publisher           0
## platforms           0
## required_age        0
## categories          0
## genres              0
## steamspy_tags       0
## achievements        0
## positive_ratings    0
## negative_ratings    0
## average_playtime    0
## median_playtime     0
## owners              0
## price               0
## dtype: int64
df['appid'].sample()
## 20206    796050
## Name: appid, dtype: int64

Removendo a coluna appid que não vamos utilizar

df.drop(columns='appid', inplace=True)

Observando a quantidade de fatores em nossa váriavel

df['english'].unique() 
## array([1, 0], dtype=int64)

Adicionando as labels ao fator, onde 0 a linguagem do game é não inglês e 1 para idioma do game em inglês.

map_dict = {0: 'non-English', 1: 'English'}

df['english'] = df['english'].map(map_dict)

fazendo o Gráfico

fig = go.Figure(data=[go.Pie(labels=df['english'].value_counts().index, 
                             values=df['english'].value_counts().values)])

fig.update_traces(textinfo='value', textfont_size=20,
                  marker=dict(colors=['salmon', 'lightblue'], 
                  line=dict(color='#000000', width=2)))

fig.update_layout(
    height=600, width=600, title_text='English and not English pie chart',
    xaxis_title='number of songs', yaxis_title='artist', title_x = 0.5,
    
    font=dict(
            family="Courier New, monospace",
            size=18,
            color="black"),
    
    legend=dict(
            orientation="h",
            yanchor="bottom",
            y=-0.2,
            xanchor="right",
            x=1)
)

fig.show()
import plotly.express as px
#df = px.data.tips()
fig = px.pie(df, values=df['english'].value_counts().values, names=df['english'].value_counts().index,
title='Jogos com idioma ingles',
color_discrete_map={'Thur':'lightcyan'})
fig.update_traces( textinfo='percent+label')
#fig.show()

temos que 98.1% dos games possui idioma ingles e apenas 1,89% nao possui este idioma

verificar a quantidade de proprietarios



df['owners'].value_counts().tail()
## 5000000-10000000       46
## 10000000-20000000      21
## 20000000-50000000       3
## 50000000-100000000      2
## 100000000-200000000     1
## Name: owners, dtype: int64

apenas 1 dos jogos possuem mais de cem milhões de proprietários(jogadores)

top_6_owners = df[
            (df['owners'] == '20000000-50000000') | 
            (df['owners'] == '50000000-100000000') | 
            (df['owners'] == '100000000-200000000')
          ].sort_values(by='owners')
          
print(top_6_owners)
          
##                                    name  ...  price
## 22                               Dota 2  ...   0.00
## 19                      Team Fortress 2  ...   0.00
## 1634                           Warframe  ...   0.00
## 3362                           Unturned  ...   0.00
## 25     Counter-Strike: Global Offensive  ...   0.00
## 12836     PLAYERUNKNOWN'S BATTLEGROUNDS  ...  26.99
## 
## [6 rows x 17 columns]

perceba que dota 2 é o jogo mais adquirido ou jogado na steam, um dos motivos pode ser seu preço(gratís).

df['release_date'] = pd.to_datetime(df['release_date'])
df['release_date'].head()
## 0   2000-11-01
## 1   1999-04-01
## 2   2003-05-01
## 3   2001-06-01
## 4   1999-11-01
## Name: release_date, dtype: datetime64[ns]

vamos verificar a quantiddade de jogos grátis


free, not_free = df[df['price'] == 0].shape[0], df[df['price'] != 0].shape[0]

labels = ['free', 'not free']

fig = px.pie(df, values=[free, not_free], names=labels,
title='relação de jogos gratuitos',
color_discrete_map={'Thur':'lightcyan'})
fig.update_traces( textinfo='percent+label')

          

apenas 9,46% dos games disponíveis são gratuitos

Vamos ver quantos jogos no Steam oferecem jogabilidade multiplayer e quantos jogos não oferecem esse recurso

import plotly.express as px

df['multiplayer'] = df['categories'].apply(lambda x: 'multi-player' in x.lower())
df.drop(columns='categories')
##                              name release_date  ... price multiplayer
## 0                  Counter-Strike   2000-11-01  ...  7.19        True
## 1           Team Fortress Classic   1999-04-01  ...  3.99        True
## 2                   Day of Defeat   2003-05-01  ...  3.99        True
## 3              Deathmatch Classic   2001-06-01  ...  3.99        True
## 4       Half-Life: Opposing Force   1999-11-01  ...  3.99        True
## ...                           ...          ...  ...   ...         ...
## 27070             Room of Pandora   2019-04-24  ...  2.09       False
## 27071                   Cyber Gun   2019-04-23  ...  1.69       False
## 27072            Super Star Blast   2019-04-24  ...  3.99        True
## 27073  New Yankee 7: Deer Hunters   2019-04-17  ...  5.19       False
## 27074                   Rune Lord   2019-04-24  ...  5.19       False
## 
## [27075 rows x 17 columns]
valor=df['multiplayer'].value_counts().values



fig = px.bar(df, x=['No-multiplayer','Multiplayer'], y= valor, title="Wide-Form Input")
fig.show()

fazendo utilizando a linguagem R

## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

carregando o banco de dados para a linguagem R

dados <-read.csv("steam.csv")

verificando se temos valores ausentes

any(is.na(dados))
## [1] FALSE

como o vaalor retornado foi null não temos dados faltantes

glimpse(dados)
## Rows: 27,075
## Columns: 18
## $ appid            <int> 10, 20, 30, 40, 50, 60, 70, 80, 130, 220, 240, 280, 3…
## $ name             <chr> "Counter-Strike", "Team Fortress Classic", "Day of De…
## $ release_date     <chr> "2000-11-01", "1999-04-01", "2003-05-01", "2001-06-01…
## $ english          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ developer        <chr> "Valve", "Valve", "Valve", "Valve", "Gearbox Software…
## $ publisher        <chr> "Valve", "Valve", "Valve", "Valve", "Valve", "Valve",…
## $ platforms        <chr> "windows;mac;linux", "windows;mac;linux", "windows;ma…
## $ required_age     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ categories       <chr> "Multi-player;Online Multi-Player;Local Multi-Player;…
## $ genres           <chr> "Action", "Action", "Action", "Action", "Action", "Ac…
## $ steamspy_tags    <chr> "Action;FPS;Multiplayer", "Action;FPS;Multiplayer", "…
## $ achievements     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 147, 0, 54, 0, 0, 0, 1…
## $ positive_ratings <int> 124534, 3318, 3416, 1273, 5250, 2758, 27755, 12120, 3…
## $ negative_ratings <int> 3339, 633, 398, 267, 288, 684, 1100, 1439, 420, 2419,…
## $ average_playtime <int> 17612, 277, 187, 258, 624, 175, 1300, 427, 361, 691, …
## $ median_playtime  <int> 317, 62, 34, 184, 415, 10, 83, 43, 205, 402, 400, 214…
## $ owners           <chr> "10000000-20000000", "5000000-10000000", "5000000-100…
## $ price            <dbl> 7.19, 3.99, 3.99, 3.99, 3.99, 3.99, 7.19, 7.19, 3.99,…
#install.packages("psych")
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
describe(dados) 
##                  vars     n      mean        sd    median   trimmed       mad
## appid               1 27075 596203.51 250894.17 599070.00 602523.30 294770.53
## name*               2 27075  13514.57   7804.06  13514.00  13514.17  10020.89
## release_date*       3 27075   1859.53    564.28   1995.00   1923.12    530.77
## english             4 27075      0.98      0.14      1.00      1.00      0.00
## developer*          5 27075   8503.96   4941.28   8430.00   8489.79   6348.49
## publisher*          6 27075   7006.89   4195.63   6863.00   6982.20   5473.76
## platforms*          7 27075      4.79      1.20      4.00      4.61      0.00
## required_age        8 27075      0.35      2.41      0.00      0.00      0.00
## categories*         9 27075   2021.24   1106.18   2762.00   2066.67    676.07
## genres*            10 27075    596.50    372.53    551.00    577.96    391.41
## steamspy_tags*     11 27075   2535.22   1824.15   2213.00   2418.19   2001.51
## achievements       12 27075     45.25    352.67      7.00     10.89     10.38
## positive_ratings   13 27075   1000.56  18988.72     24.00     79.30     32.62
## negative_ratings   14 27075    211.03   4284.94      9.00     24.56     11.86
## average_playtime   15 27075    149.80   1827.04      0.00     17.02      0.00
## median_playtime    16 27075    146.06   2353.88      0.00     17.51      0.00
## owners*            17 27075      2.75      3.02      1.00      2.08      0.00
## price              18 27075      6.08      7.87      3.99      4.85      4.45
##                  min        max      range   skew kurtosis      se
## appid             10 1069460.00 1069450.00  -0.22    -0.65 1524.78
## name*              1   27033.00   27032.00   0.00    -1.20   47.43
## release_date*      1    2619.00    2618.00  -0.99     0.61    3.43
## english            0       1.00       1.00  -7.07    48.00    0.00
## developer*         1   17113.00   17112.00   0.02    -1.21   30.03
## publisher*         1   14354.00   14353.00   0.03    -1.24   25.50
## platforms*         1       7.00       6.00   1.00    -0.78    0.01
## required_age       0      18.00      18.00   6.75    44.09    0.01
## categories*        1    3333.00    3332.00  -0.36    -1.67    6.72
## genres*            1    1552.00    1551.00   0.37    -0.61    2.26
## steamspy_tags*     1    6423.00    6422.00   0.40    -0.97   11.09
## achievements       0    9821.00    9821.00  13.43   191.14    2.14
## positive_ratings   0 2644404.00 2644404.00 106.10 14083.85  115.40
## negative_ratings   0  487076.00  487076.00  88.63  9122.52   26.04
## average_playtime   0  190625.00  190625.00  59.52  5081.15   11.10
## median_playtime    0  190625.00  190625.00  64.36  4893.18   14.31
## owners*            1      13.00      12.00   1.49     0.79    0.02
## price              0     421.99     421.99  11.73   420.71    0.05
library(DT)
library("gt")

dados %>% datatable()
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

aparentimente a coluna a appid é apenas um identificador(id),não vamos utiliza-lá

dados<-dados[-1]
table(dados$english)
## 
##     0     1 
##   511 26564

asumandindo 0 como não ingles e 1 como ingles temos :

library(plotly)

USPersonalExpenditure <- data.frame("Categorie"=rownames(USPersonalExpenditure), USPersonalExpenditure)
categoria<-c("no inglesh","inglesh")

dados$inglesf<-factor(c(dados$english), levels = c("0","1"))

coloris<-c("blue","red")

p <- dados %>%
  group_by(english) %>%
  summarize(count = n()) %>%
  arrange(desc(count)) %>% 
  head(5) %>%
  plot_ly( labels = ~english, values = ~count, type = 'pie', textposition = 'inside',
           textinfo = 'label+percent',
           insidetextfont = list(color = '#FFFFFF'),
           hoverinfo = 'text',
           text = ~paste(english, count),
           marker = list(colors = coloris,
                         line = list(color = '#FFFFFF', width = 1))) %>% 
  layout(title = "Jogos com idioma ingles",  showlegend = F,
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = TRUE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = TRUE))
p

Como podemos observar,mais de 98% dos games na Steam possuem idioma em inglês .

Respostas Para as Perguntas Solicitadas

Qual a quantidade de jogos na Steam são gratuitos?

colors <- c('rgb(211,94,96)', 'rgb(128,133,133)', 'rgb(144,103,167)', 'rgb(171,104,87)', 'rgb(114,147,203)')
dados %>%
  group_by(categories) %>% unique( ) %>%
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  head(5) %>%
  plot_ly( labels = ~categories, values = ~count, type = 'pie', textposition = 'inside',
           textinfo = 'label+percent',
           insidetextfont = list(color = '#FFFFFF'),
           hoverinfo = 'text',
           text = ~paste(categories, count),
           marker = list(colors = colors,
                         line = list(color = '#FFFFFF', width = 1)),
           #The 'pull' attribute can also be used to create space between the sectors
           showlegend = FALSE)

Qual a quantidade de jogos na Steam são gratuitos?

Para saber o numero de jogos que são gratis vamos filtrar os dados pelo preço e depois agrupar pelo nome

t<-dados %>% filter(price == "0") %>% 
  group_by(name) 
  
#para saber a quantidades de jogos gratis basta calcular o numero de linhas   
  nrow(t)
## [1] 2560

Qual as distribuições mais suportadas (porcentagem) (MAC, LiNUX ou WINDOWS)?

dados %>%
  group_by(platforms) %>% unique( ) %>%
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  head(5) %>%
  plot_ly( labels = ~platforms, values = ~count, type = 'pie', textposition = 'inside',
           textinfo = 'label+percent',
           insidetextfont = list(color = '#FFFFFF'),
           hoverinfo = 'text',
           text = ~paste(platforms, count),
           marker = list(colors = colors,
                         line = list(color = '#FFFFFF', width = 1)),
           #The 'pull' attribute can also be used to create space between the sectors
           showlegend = FALSE)%>% 
layout(title = "Plataformas com Maior Suporte",  showlegend = F,
                                 xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
                                 yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

vimos que mais de 65 % dos games estão disponiveis na plataforma steam .

Encontre correlações entre os tipos de jogos. Exemplo quem mais joga dota 2 prefere jogar qual jogo também?

library(DT)

 dados %>% filter(
                    steamspy_tags == "Free to Play;MOBA;Strategy" | genres== "Action;Free to Play;Strategy"  &
                       median_playtime > 800 & price == 0) %>%  datatable()

esses são os possiveis jogoss que o usuario vai gostar

Encontre correlações entre os tipos de jogos. Exemplo quem mais joga dota 2 prefere jogar qual jogo também?

 dados %>%
   group_by(genres) %>% unique( ) %>%
   summarise(count = n()) %>% 
   arrange(desc(count)) %>% 
   head(1) %>% datatable()

o gênero action,indie é o mais jogado na steam.

Conclusão

Como podemos ver podemos executar Varias análises utilizando ambas linguagens, o intuíto desse material foi de fato moostrar isso ,claro que poderiamos realisar outros insights ,mas por hora vamos parar por aqui .